插入排序的三种算法C/C++

一、直接插入排序
1、平均时间复杂度为O(n^2)
2、最好情况为O(n)
3、最坏情况下为O(n^2)
4、空间复杂度为O(1)

算法实现为:

/*
 *直接插入排序
 */

#include<stdio.h>

#define MaxSize 100

/*
 *a为待排序的数组,length为数组长度
 */
void inSort(int a[] , int length) ;

/*
 *进行数组元素的输出
 */
void displayArray(int a[] , int length) ;

void main()
{
    int a[MaxSize] , length , i ;
    printf("Please input the length of the array : \n") ;
    scanf("%d" , &length) ;

    //进行数组元素的接收
    for(i = 0 ; i < length ; i++)
    {
        scanf("%d" , &a[i]) ;
    }

    printf("Before sort... \n") ;
    displayArray(a , length) ;

    inSort(a , length) ;

    printf("After sort... \n") ;
    displayArray(a , length) ;
}

void inSort(int a[] , int length)
{
    //临时储存元素
    int temp ;
    int i , j ;             
    for(i = 1 ; i < length ; i++)
    {
        temp = a[i] ;
        j = i - 1 ;
        while(temp < a[j] && j >= 0)
        {
            a[j + 1] = a[j] ;           
            j-- ;
        }
        a[j + 1] = temp ;
    }
}

void displayArray(int a[] , int length)
{   
    int i ;
    for(i = 0 ; i < length ; i++)
    {
        printf("%4d ", a[i]);
    }
    printf("\n") ;
}

二、折半插入排序
1、平均时间复杂度为O(n^2)
2、最好情况为O(nlogn)
3、最坏情况下为O(n^2)
4、空间复杂度为O(1)

算法实现为:

/*
 *折半插入排序
 */

#include<stdio.h>

#define MaxSize 100

/*
 *a为待排序的数组,length为数组长度
 */
void binSort(int a[] , int length) ;

/*
 *进行数组元素的输出
 */
void displayArray(int a[] , int length) ;

void main()
{
    int a[MaxSize] , length , i ;
    printf("Please input the length of the array : \n") ;
    scanf("%d" , &length) ;

    //进行数组元素的接收
    for(i = 0 ; i < length ; i++)
    {
        scanf("%d" , &a[i]) ;
    }

    printf("Before sort... \n") ;
    displayArray(a , length) ;

    binSort(a , length) ;

    printf("After sort... \n") ;
    displayArray(a , length) ;
}

void binSort(int a[] , int length)
{
    int i , j , mid , low , high , temp ;
    for(i = 1 ; i < length ; i ++)
    {
        low = 0 ;
        high = i - 1 ;
        temp = a[i];
        while(low <= high)
        {
            mid = (low + high) / 2 ;
            if(temp < a[mid])
            {
                high = mid - 1 ;
            }else{
                low = mid + 1 ;
            }
        }
        for(j = i - 1 ; j >= low ; j--)
        {
            a[j + 1] = a[j] ;
        }
        a[low] = temp ;
    }   
}

void displayArray(int a[] , int length)
{   
    int i ;
    for(i = 0 ; i < length ; i++)
    {
        printf("%4d ", a[i]);
    }
    printf("\n") ;
}

三、希尔排序
1、平均时间复杂度为O(n^1.5)
4、空间复杂度为O(1)

算法实现为:

/*
 *希尔排序
 */

#include<stdio.h>

#define MaxSize 100

/*
 *进行希尔排序
 *a为待排序数组,lengh为数组长度,delta为增量数组,length1为增量数组的长度
 */
void shellSort(int a[] , int lengh , int delta[] , int length1) ;

/*
 *进行一趟希尔排序
 */
void shellInsert(int a[] , int length , int delta) ;

/*
 *进行数组的输出
 */
void displayArray(int a[] , int length) ;

void main()
{
    int a[MaxSize] , length , i ;
    int delta[MaxSize] , length1 ;

    printf("Please input the length of the array : ") ;
    scanf("%d" , &length) ;

    //进行数组元素的接收
    for(i = 0 ; i < length ; i++)
    {
        scanf("%d" , &a[i]) ;
    }

    //进行增量数组的接收
    printf("Please input the delta's length : ") ;
    scanf("%d" , &length1) ;

    //进行数组元素的接收
    for(i = 0 ; i < length1 ; i++)
    {
        scanf("%d" , &delta[i]) ;
    }

    printf("Before sort... \n") ;
    displayArray(a , length) ;

    shellSort(a , length , delta , length1) ;

    printf("After sort... \n") ;
    displayArray(a , length) ;
}

void shellSort(int a[] , int length , int delta[] , int length1)
{
    int i ;
    for(i = length1 - 1 ; i >= 0 ; i--)
    {
        shellInsert(a , length , delta[i]) ;
    }
}

void shellInsert(int a[] , int length , int delta)
{
    int i , j , temp ;
    for(i = delta ; i < length ; i++)
    {
        temp = a[i] ;
        j = i - delta ;
        while(temp < a[j] && j >= 0)
        {
            a[j + delta] = a[j] ;
            j -= delta ;
        }
        a[j + delta] = temp ;
    }
}   

void displayArray(int a[] , int length)
{   
    int i ;
    for(i = 0 ; i < length ; i++)
    {
        printf("%4d ", a[i]);
    }
    printf("\n") ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值